package frsf.cidisi.exercise.tp2.interfaz;

import javax.swing.SwingUtilities;

import com.sun.org.apache.bcel.internal.generic.GETSTATIC;

import frsf.cidisi.exercise.tp2.situationCalculus.Arqueologo;
import frsf.cidisi.exercise.tp2.situationCalculus.EstadoActualArqueologo;
import frsf.cidisi.exercise.tp2.situationCalculus.IslaEmiroce;
import frsf.cidisi.exercise.tp2.utiles.DatosAmbiente;
import frsf.cidisi.exercise.tp2.utiles.MetodosUtiles;
import frsf.cidisi.exercise.tp2.utiles.Parametros;
import frsf.cidisi.faia.exceptions.PrologConnectorException;
import frsf.cidisi.faia.simulator.SearchBasedAgentSimulator;
import frsf.cidisi.faia.simulator.Log;
import frsf.cidisi.faia.simulator.SituationCalculusBasedAgentSimulator;

public class ControlSimulacion {

	private Parametros parametros = new Parametros();
	private DatosAmbiente datosAmbiente = new DatosAmbiente();
	private MetodosUtiles metodosUtiles = new MetodosUtiles();
	private int escenario = 1;
	private IslaEmiroce environment;
	private Arqueologo agent;
	private Log log = new Log();
	private int esperaDePaso;
	private Principal interfaz;
	private SearchBasedAgentSimulator simulator;
	
	public void GenerarSimulacion() throws PrologConnectorException{
					
//      Arqueologo agent = new Arqueologo();
//      IslaEmiroce environment = new IslaEmiroce();
//
		this.setAgent(new Arqueologo());
	   	   getAgent().setControlSimulacion(this);
	   	   getAgent().setParametros(parametros);
	       getAgent().setMetodosUtiles(metodosUtiles);
	       getAgent().setLog(getLog());
	       
	       getAgent().getAgentState().setPosicionDeseada(getParametros().getNombreAldeas()[getParametros().getPosicionDeseada()-1]);
	       getAgent().getAgentState().setPosicionInicial(getParametros().getNombreAldeas()[getParametros().getPosicionInicial()-1]);
	       getAgent().getAgentState().setPosicionAgente(getParametros().getPosicionInicial());
	       
	       
	       getAgent().actualizarFuncionObjetivo();
	       
	    setEnvironment(new IslaEmiroce());
	    	getEnvironment().setControlSimulacion(this);
	    	getEnvironment().setLog(getLog());
	    	getEnvironment().setPirata(parametros.isPirata());
	    	getEnvironment().setDatosAmbiente(datosAmbiente);
	    	getEnvironment().actualizarDatosAmbiente(escenario);
	    	getEnvironment().getEnvironmentState().setposicionAgente(((EstadoActualArqueologo)agent.getAgentState()).getPosicionAgente());
	    	
	    	getAgent().setDatosAmbiente(environment.getDatosAmbiente());
	    	getAgent().actualizarDatosAmbiente(escenario);
			
	}

	public void iniciarSimulacion(){
		
	    SituationCalculusBasedAgentSimulator simulator = new SituationCalculusBasedAgentSimulator(environment, agent);

	      simulator.setLog(log);
		  simulator.setEsperaDePaso(getEsperaDePaso());

		  simulator.start();
		  
		  
//		for(int i=0;i<11;i++){
//			getInterfaz().getTxtPosicion().setText(i+"");
//			getInterfaz().getPanelGeneral().validate();
//			try {
//				Thread.sleep(1000);
//			} catch (InterruptedException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		}
		
 //		simulator = new SearchBasedAgentSimulator(getEnvironment(), getAgent());
//		imprimirLog();
	  
	}
	
	public void actualizarEstadoEnInterfaz(){
		
		double tesoro=((EstadoActualArqueologo)getAgent().getAgentState()).getTesoroAcoplado();
		double pesoAcopladoAgente = ((EstadoActualArqueologo)getAgent().getAgentState()).getPesoAcopladoAgente();
		interfaz.getTxtPosicion().setText(((EstadoActualArqueologo)getAgent().getAgentState()).getPosicionAgente()+"");
		interfaz.getTxtAcoplado().setText("["+(float)tesoro+" , "+(float)pesoAcopladoAgente+"]");
		interfaz.getTxtObjetivo().setText(getParametros().getPosicionDeseada()+"");
		
		//actualizacion estado ambiente
		
		interfaz.getTxtAldea1().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[0][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[0][1]+"]");
				
		interfaz.getTxtAldea2().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[1][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[1][1]+"]");
		
		interfaz.getTxtAldea3().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[2][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[2][1]+"]");
		
		interfaz.getTxtAldea4().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[3][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[3][1]+"]");
		
		interfaz.getTxtAldea5().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[4][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[4][1]+"]");
		
		interfaz.getTxtAldea6().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[5][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[5][1]+"]");
	
		interfaz.getTxtAldea7().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[6][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[6][1]+"]");
	
		interfaz.getTxtAldea8().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[7][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[7][1]+"]");
		
		interfaz.getTxtAldea9().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[8][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[8][1]+"]");
		
		interfaz.getTxtAldea10().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[9][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[9][1]+"]");
		
		interfaz.getTxtAldea11().setText("["+(float)getEnvironment().getEnvironmentState().gettesoros()[10][0]+" , "+(float)getEnvironment().getEnvironmentState().gettesoros()[10][1]+"]");
		
		//actualizacion estado ubeme
		interfaz.getTxtPosicionUbeme().setText(getEnvironment().getEnvironmentState().getposicionPirata()+"");

		interfaz.getTxtTesorosRobados().setText("["+(float)getEnvironment().getEnvironmentState().getTesoroPirata()/1000+" , "+(float)getEnvironment().getEnvironmentState().getPesoAcopladoPirata()+"]");
	}
	
	
	public void imprimirLog(){
		
		while(!getLog().getLogVolatil().isEmpty()){
			
			System.out.println(getLog().getLogVolatil().getFirst());
			getLog().getLogVolatil().removeFirst();
		}
	}

	public void setEscenario(int escenario) {
		this.escenario = escenario;
	}


	public int getEscenario() {
		return escenario;
	}


	public Parametros getParametros() {
		return parametros;
	}


	public void setParametros(Parametros parametros) {
		this.parametros = parametros;
	}


	public DatosAmbiente getDatosAmbiente() {
		return datosAmbiente;
	}


	public void setDatosAmbiente(DatosAmbiente datosAmbiente) {
		this.datosAmbiente = datosAmbiente;
	}


	public MetodosUtiles getMetodosUtiles() {
		return metodosUtiles;
	}


	public void setMetodosUtiles(MetodosUtiles metodosUtiles) {
		this.metodosUtiles = metodosUtiles;
	}

	public void setEnvironment(IslaEmiroce environment) {
		this.environment = environment;
	}

	public IslaEmiroce getEnvironment() {
		return environment;
	}

	public void setAgent(Arqueologo agent) {
		this.agent = agent;
	}

	public Arqueologo getAgent() {
		return agent;
	}

	public Log getLog() {
		return log;
	}

	public void setLog(Log log) {
		this.log = log;
	}

	public void setEsperaDePaso(int esperaDePaso) {
		this.esperaDePaso = esperaDePaso;
	}

	public int getEsperaDePaso() {
		return esperaDePaso;
	}

	public void setInterfaz(Principal interfaz) {
		this.interfaz = interfaz;
	}

	public Principal getInterfaz() {
		return interfaz;
	}

	public void actualizarConsolaEnInterfaz() {
		
		String agregarAConsola = "";
		String agregar = getSimulator().getLog().getMensaje();
		
		while(!agregar.equals("No hay mas mensajes")){
			

			agregarAConsola = agregarAConsola +"\n" + agregar;
			agregar = getSimulator().getLog().getMensaje();	
			 	
		}
		 
		
		getInterfaz().getConsola().setText(getInterfaz().getConsola().getText()+agregarAConsola);
		
		
	}

	public SearchBasedAgentSimulator getSimulator() {
		return simulator;
	}

	public void setSimulator(SearchBasedAgentSimulator simulator) {
		this.simulator = simulator;
	}
	
	
}
